package com.cskaoyan.datasource;

import com.cskaoyan.jdbc.util.JDBCUtils;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;

/**
 * 创建日期: 2022/06/05 11:06
 *
 * @author ciggar
 *
 * // 1. 干掉魔法值
 *
 * // 2. 自动扩容
 *
 *  // 阿里巴巴开发手册
 *  // 王道编程规范
 *
 *  // TODO
 *  1. 连接上限
 *
 *  2. 超时自动回收
 *
 *  3. 把数据库连接池的数值 写到配置文件中，让用户可以自由的配置
 *
 *  4. 考虑一下线程安全的问题
 *
 *  5. 考虑一下 关闭连接然后返回的问题
 *    - 目前数据库连接池中存放的是 JDBC4Connection 对象
 *    - 既然用户要关闭连接，那么我们就让用户关闭连接
 *    - 但是我们作为数据库连接池的开发者，可以做两件事情
 *    -  1. 自己实现Connection接口，然后在连接池中 放入自己实现的实例对象，这个自己实现的对象中，把close方法改为返回连接到连接池
 *    -  2. 写一个JDBC4Connection对象的子类，这个子类中重写close方法，在数据库连接池中，存放这个子类
 *
 *  6. javax.sql.Datasource 自己实现数据库连接池需要实现这个接口
 *
 */
public class MyConnectionPoolV4  implements DataSource {

    // 声明一个存放连接的容器  从尾部拿，从头部存
    static LinkedList<Connection> linkedList;


    // 初始值
    static int INIT_SIZE = 10;

    // 最小空闲连接
    static int MIN_SIZE = 3;


    // 扩容大小
    static int INCREMENT_SIZE = 5;






    static {
        // 初始化
        linkedList = new LinkedList<Connection>();

        addCapacity(INIT_SIZE);


    }


    // 获取连接

    public Connection getConnection(){

        // 检查一下是否应该扩容
        if (linkedList.size() <=  MIN_SIZE){
            addCapacity(INCREMENT_SIZE);
        }

        Connection connection = linkedList.removeLast();

        return connection;


    }



    // 返回连接
    public static void returnConnection(Connection connection){

        linkedList.addFirst(connection);

    }


    // 增加连接
    public static void addCapacity(int count){

        if (count <= 0) return;

        for (int i = 0; i < count; i++) {
            linkedList.add(JDBCUtils.getConnection());
        }

    }







    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }


    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }
}
